﻿#include "../exercise.h"
#include <string>

// READ: 字符串 <https://zh.cppreference.com/w/cpp/string/basic_string>

// std::string reverse_string(const std::string& str) {
//     // TODO: 实现字符串反转函数
// }

// std::string reverse_string(const std::string& str) {
//     // 实现字符串反转函数
//     std::string reversed;
//     reversed.reserve(str.size());  // 预分配空间提高效率
//     for (auto it = str.rbegin(); it != str.rend(); ++it) {
//         reversed.push_back(*it);
//     }
//     return reversed;
    
//     // 或者使用更简洁的方法：
//     // return std::string(str.rbegin(), str.rend());
// }

std::string reverse_string(const std::string& str) {
    // 或者使用更简洁的方法：
    return std::string(str.rbegin(), str.rend());
}

int main(int argc, char **argv) {
    // READ: 字符串字面量 <https://zh.cppreference.com/w/cpp/string/basic_string/operator%22%22s>
    using namespace std::string_literals;
    auto hello = "Hello"s;
    auto world = "world";
    // READ: `decltype` 表达式 <https://zh.cppreference.com/w/cpp/language/decltype>
    // READ: `std::is_same_v` 元编程判别 <https://zh.cppreference.com/w/cpp/types/is_same>
    
    // ASSERT((std::is_same_v<decltype(hello), ?>), "Fill in the missing type.");
    // ASSERT((std::is_same_v<decltype(world), ?>), "Fill in the missing type.");
    ASSERT((std::is_same_v<decltype(hello), std::string>), "Fill in the missing type.");
    ASSERT((std::is_same_v<decltype(world), const char*>), "Fill in the missing type.");
      
    
    
    // TODO: 将 `?` 替换为正确的字符串
    // ASSERT(hello + ", " + world + '!' == "?", "Fill in the missing string.");
    ASSERT(hello + ", " + world + '!' == "Hello, world!", "Fill in the missing string.");



    // NOTICE: 了解字符串的基本操作，如 `size`、`substr`、`find` 等。
    
    // TODO: 实现字符串反转函数
    ASSERT(reverse_string("Hello world!") == "!dlrow olleH", "Fill in the missing string.");
    ASSERT(reverse_string("Hello") == "olleH", "Fill in the missing string.");
    ASSERT(reverse_string("") == "", "Fill in the missing string.");

    // size
    // ASSERT(hello.size() == ?, "Fill in the missing value.");
    // ASSERT(world.size() == ?, "Fill in the missing value.");
    ASSERT(hello.size() == 5, "Fill in the missing value.");
    ASSERT(std::string(world).size() == 5, "Fill in the missing value.");



    // NOTICE: `std::string`的 size 计算方法和 `\0` 无关。
    std::string str1 = "Hello\0world!";
    std::string str2 = "Hello world!";
    // ASSERT(str1.size() ==?, "Fill in the missing value.");
    // ASSERT(str2.size() ==?, "Fill in the missing value.");
    ASSERT(str1.size() == 5, "Fill in the missing value.");  // 遇到\0停止
    ASSERT(str2.size() == 12, "Fill in the missing value.");


    // substr
    // ASSERT(hello.substr(0, 2) ==?, "Fill in the missing string.");
    // ASSERT(world.substr(1, 3) ==?, "Fill in the missing string.");
    ASSERT(hello.substr(0, 2) == "He", "Fill in the missing string.");
    ASSERT(std::string(world).substr(1, 3) == "orl", "Fill in the missing string.");



    // string capacity
    hello.resize(10);
    hello.reserve(100);
    // ASSERT(hello.size() ==?, "Fill in the missing value.");
    // ASSERT(hello.capacity() ==?, "Fill in the missing value.");
    ASSERT(hello.size() == 10, "Fill in the missing value.");
    ASSERT(hello.capacity() >= 100, "Fill in the missing value.");



    // NOTICE: 注意 `std::string` 的SSO优化，什么条件下使用栈内存，什么条件下使用堆内存。
    // READ: SSO优化 <https://lb3fn675fh.feishu.cn/wiki/A30KwguMein859k9xtzcJtSRnYc>
    std::string long_string(10000, 'a');
    std::string short_string(10, 'a');
    // THINK:  `long_string` 和 `short_string` 分别使用的是栈内存还是堆内存。
    // THINK: 栈内存和堆内存的区别是什么？
    // THINK: 什么是SSO优化？

    return 0;
}



/*
字符串string

字符串反转

字符串字面量

`decltype` 表达式 
decltype(hello)
decltype(world)
auto hello = "Hello"s;
auto world = "world";

`std::is_same_v` 元编程判别
std::is_same_v<decltype(hello), std::string>

`std::string` 的SSO优化



size()：

hello.size()：返回5（"Hello"的长度）
str1.size()：返回5（遇到\0停止）
substr()：

hello.substr(0, 2)：从位置0开始，取2个字符 → "He"
world.substr(1, 3)：从位置1开始，取3个字符 → "orl"

4. 容量管理
hello.resize(10);     // 改变大小为10（用空字符填充）
hello.reserve(100);   // 预分配至少100字节的容量
size()：当前元素数量（10）
capacity()：当前分配的存储空间（≥100）

SSO优化（Short String Optimization）
什么是SSO？
SSO是一种优化技术，小字符串直接存储在std::string对象内部的缓冲区中，避免堆内存分配。

SSO的优势
性能：避免小字符串的堆内存分配/释放
局部性：数据在栈上，缓存友好
安全性：减少内存碎片
典型实现
GCC/libstdc++：SSO容量通常为15字符（64位系统）
Clang/libc++：SSO容量通常为22字符（64位系统）
MSVC：SSO容量通常为15字符（64位系统）
*/